{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2708432c",
   "metadata": {},
   "source": [
    "### Regarding Warnings\n",
    "* Warning in the notebook is due to the discrepancy in package version between local and server environment\n",
    "* Readers can ignore them or update the packages to the required version through \"pip install [package]==[version]\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5c1af3e2",
   "metadata": {},
   "source": [
    "### Session Creation "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "23aa55f1-e9c2-4d52-9c88-97fc81b2467c",
   "metadata": {
    "executionInfo": {
     "elapsed": 4591,
     "status": "ok",
     "timestamp": 1700293652284,
     "user": {
      "displayName": "Vivek Ss",
      "userId": "14764910798655109096"
     },
     "user_tz": -330
    },
    "id": "23aa55f1-e9c2-4d52-9c88-97fc81b2467c"
   },
   "outputs": [],
   "source": [
    "from snowflake.snowpark import Session\n",
    "from snowflake.snowpark.functions import col\n",
    "import configparser\n",
    "import pandas as pd\n",
    "\n",
    "\n",
    "# Loading Credentials From Config File\n",
    "snowflake_credentials_file = '../snowflake_creds.config'\n",
    "config = configparser.ConfigParser()\n",
    "config.read(snowflake_credentials_file)\n",
    "connection_parameters = dict(config['default'])\n",
    "session = Session.builder.configs(connection_parameters).create()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e620c24a",
   "metadata": {},
   "source": [
    "#### Creating Snowflake Objects "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "648b5b0e",
   "metadata": {},
   "outputs": [],
   "source": [
    "session.sql(\"CREATE WAREHOUSE IF NOT EXISTS COMPUTE_WH WITH WAREHOUSE_SIZE='X-SMALL'\").collect()\n",
    "session.sql(\"CREATE DATABASE IF NOT EXISTS SNOWPARK_DEFINITIVE_GUIDE\").collect()\n",
    "session.sql(\"CREATE SCHEMA IF NOT EXISTS SNOWPARK_DEFINITIVE_GUIDE.MY_SCHEMA\").collect()\n",
    "session.sql(\"CREATE STAGE IF NOT EXISTS SNOWPARK_DEFINITIVE_GUIDE.MY_SCHEMA.MY_STAGE\").collect()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dbd9a7b2",
   "metadata": {},
   "source": [
    "### Loading Bike Sharing Dataset as Snowflake Table\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "bf8c60e8-fcdf-4f95-8447-d6fbb20ceaf4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<snowflake.snowpark.table.Table at 0x2746b82dfd0>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "session.use_database(\"SNOWPARK_DEFINITIVE_GUIDE\")\n",
    "session.use_schema(\"MY_SCHEMA\")\n",
    "\n",
    "bike_share_df = pd.read_csv(\"../datasets/bike_sharing_demand.csv\")\n",
    "\n",
    "# Renaming Column Names To Maintain Snowflake Convention\n",
    "bike_share_df.columns = [column.upper() for column in bike_share_df.columns]\n",
    "\n",
    "session.write_pandas(\n",
    "     bike_share_df,\n",
    "     \"BSD_TRAINING\",\n",
    "     database = \"SNOWPARK_DEFINITIVE_GUIDE\",\n",
    "     schema = \"MY_SCHEMA\",\n",
    "     overwrite = True,\n",
    "     auto_create_table =True\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ca6c8370",
   "metadata": {},
   "source": [
    "### Exploring & Preparing Data\n",
    "\n",
    "* Section covers code snippets to explore the dataset\n",
    "* Code snippets encompasses  high level data exploration function - top rows, row & column count etc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a3faf3be-7942-41dd-91ff-7cb9fb627a41",
   "metadata": {},
   "outputs": [],
   "source": [
    "from snowflake.snowpark.functions import cast\n",
    "from snowflake.snowpark.types import TimestampType\n",
    "\n",
    "\n",
    "df_table = session.table(\"BSD_TRAINING\")\n",
    "df_table = df_table.with_column(\"DATETIME\", cast(\"DATETIME\", TimestampType()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "df9f787f-9672-458b-ab5d-7baad578a540",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 914,
     "status": "ok",
     "timestamp": 1700293804550,
     "user": {
      "displayName": "Vivek Ss",
      "userId": "14764910798655109096"
     },
     "user_tz": -330
    },
    "id": "df9f787f-9672-458b-ab5d-7baad578a540",
    "outputId": "8dfd4266-2e42-4a76-fb41-b213683484a7"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total No of rows in dataset :  10886\n",
      "Total No of columns in dataset :  12\n"
     ]
    }
   ],
   "source": [
    "#Shape Of The Dataset\n",
    "number_of_rows = df_table.count()\n",
    "number_of_columns = len(df_table.columns)\n",
    "print(\"Total No of rows in dataset : \",number_of_rows)\n",
    "print(\"Total No of columns in dataset : \",number_of_columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "107541c9-03cd-4713-871f-5277da103294",
   "metadata": {
    "id": "107541c9-03cd-4713-871f-5277da103294",
    "outputId": "48ec296b-5369-4afb-91a0-c43f45b51b3b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|\"SEASON\"  |\"HOLIDAY\"  |\"WORKINGDAY\"  |\"WEATHER\"  |\"TEMP\"  |\"ATEMP\"  |\"HUMIDITY\"  |\"WINDSPEED\"  |\"CASUAL\"  |\"REGISTERED\"  |\"COUNT\"  |\"DATETIME\"           |\n",
      "-----------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|2         |0          |1             |2          |25.42   |30.305   |69          |11.0014      |47        |595           |642      |2012-06-18 18:00:00  |\n",
      "|4         |0          |0             |1          |13.94   |15.15    |31          |22.0028      |51        |242           |293      |2011-12-10 14:00:00  |\n",
      "-----------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "\n"
     ]
    }
   ],
   "source": [
    "#Sample Of First Few Rows\n",
    "df_table.sample(n=2).show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "MguXFHHcaegc",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 380,
     "status": "ok",
     "timestamp": 1700294187162,
     "user": {
      "displayName": "Vivek Ss",
      "userId": "14764910798655109096"
     },
     "user_tz": -330
    },
    "id": "MguXFHHcaegc",
    "outputId": "19a82b65-a6f8-420f-aedd-32c0e8c88c63"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[StructField('SEASON', LongType(), nullable=True),\n",
      " StructField('HOLIDAY', LongType(), nullable=True),\n",
      " StructField('WORKINGDAY', LongType(), nullable=True),\n",
      " StructField('WEATHER', LongType(), nullable=True),\n",
      " StructField('TEMP', DoubleType(), nullable=True),\n",
      " StructField('ATEMP', DoubleType(), nullable=True),\n",
      " StructField('HUMIDITY', LongType(), nullable=True),\n",
      " StructField('WINDSPEED', DoubleType(), nullable=True),\n",
      " StructField('CASUAL', LongType(), nullable=True),\n",
      " StructField('REGISTERED', LongType(), nullable=True),\n",
      " StructField('COUNT', LongType(), nullable=True),\n",
      " StructField('DATETIME', TimestampType(tz=ntz), nullable=True)]\n"
     ]
    }
   ],
   "source": [
    "import pprint\n",
    "data_types = df_table.schema\n",
    "data_types = df_table.schema.fields\n",
    "pprint.pprint(data_types)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "74b8ae54",
   "metadata": {},
   "source": [
    "### Missing Value Analysis\n",
    "\n",
    "* Section covers option to explore missing values in each feature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "7e02d836-a01e-4637-bf45-5d3fdb5889d1",
   "metadata": {
    "id": "7e02d836-a01e-4637-bf45-5d3fdb5889d1",
    "outputId": "42086be2-fdad-4fa3-e1f9-841ccb0d316d"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "StructType([StructField('SEASON', LongType(), nullable=True), StructField('HOLIDAY', LongType(), nullable=True), StructField('WORKINGDAY', LongType(), nullable=True), StructField('WEATHER', LongType(), nullable=True), StructField('TEMP', DoubleType(), nullable=True), StructField('ATEMP', DoubleType(), nullable=True), StructField('HUMIDITY', LongType(), nullable=True), StructField('WINDSPEED', DoubleType(), nullable=True), StructField('CASUAL', LongType(), nullable=True), StructField('REGISTERED', LongType(), nullable=True), StructField('COUNT', LongType(), nullable=True), StructField('DATETIME', TimestampType(tz=ntz), nullable=True)])\n",
      "Null values in SEASON is 0\n",
      "Null values in HOLIDAY is 0\n",
      "Null values in WORKINGDAY is 0\n",
      "Null values in WEATHER is 0\n",
      "Null values in TEMP is 0\n",
      "Null values in ATEMP is 0\n",
      "Null values in HUMIDITY is 0\n",
      "Null values in WINDSPEED is 0\n",
      "Null values in CASUAL is 0\n",
      "Null values in REGISTERED is 0\n",
      "Null values in COUNT is 0\n",
      "Null values in DATETIME is 0\n"
     ]
    }
   ],
   "source": [
    "from snowflake.snowpark.functions import count, col\n",
    "data_types = df_table.schema\n",
    "print(data_types)\n",
    "for column in df_table.columns:\n",
    "    print(f\"Null values in {column} is {number_of_rows - df_table.agg(count(col(column))).collect()[0][0]}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7f7f1fbc",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(f\"Zero Values in windspeed column is {df_table.filter(df_table['WINDSPEED']==0).count()}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8186f3a3",
   "metadata": {},
   "outputs": [],
   "source": [
    "from snowflake.snowpark.functions import iff, avg\n",
    "wind_speed_mean = df_table.select(mean(\"windspeed\")).collect()[0][0]\n",
    "df_train = df_table.replace({0:wind_speed_mean}, subset=[\"windspeed\"])\n",
    "df_train.show()\n",
    "df_train.write.mode(\"overwrite\").save_as_table(\"model_data\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "WkeOK2Q27ZOS",
   "metadata": {
    "id": "WkeOK2Q27ZOS"
   },
   "source": [
    "### Feature Engineering\n",
    "\n",
    "* Section encompasses code snippets to create new features from DATETIME Column"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "c6a4cbf2-4df3-4977-86b8-8be4156a30e8",
   "metadata": {
    "id": "c6a4cbf2-4df3-4977-86b8-8be4156a30e8",
    "outputId": "a3d4e7d2-b29a-4d09-8ffd-8497d6afc194"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|\"SEASON\"  |\"HOLIDAY\"  |\"WORKINGDAY\"  |\"WEATHER\"  |\"TEMP\"  |\"ATEMP\"  |\"HUMIDITY\"  |\"WINDSPEED\"  |\"CASUAL\"  |\"REGISTERED\"  |\"COUNT\"  |\"DATETIME\"           |\"HOUR\"  |\n",
      "--------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|1         |0          |0             |1          |9.84    |14.395   |81          |0.0          |3         |13            |16       |2011-01-01 00:00:00  |0       |\n",
      "|1         |0          |0             |1          |9.02    |13.635   |80          |0.0          |8         |32            |40       |2011-01-01 01:00:00  |1       |\n",
      "|1         |0          |0             |1          |9.02    |13.635   |80          |0.0          |5         |27            |32       |2011-01-01 02:00:00  |2       |\n",
      "|1         |0          |0             |1          |9.84    |14.395   |75          |0.0          |3         |10            |13       |2011-01-01 03:00:00  |3       |\n",
      "|1         |0          |0             |1          |9.84    |14.395   |75          |0.0          |0         |1             |1        |2011-01-01 04:00:00  |4       |\n",
      "|1         |0          |0             |2          |9.84    |12.88    |75          |6.0032       |0         |1             |1        |2011-01-01 05:00:00  |5       |\n",
      "|1         |0          |0             |1          |9.02    |13.635   |80          |0.0          |2         |0             |2        |2011-01-01 06:00:00  |6       |\n",
      "|1         |0          |0             |1          |8.2     |12.88    |86          |0.0          |1         |2             |3        |2011-01-01 07:00:00  |7       |\n",
      "|1         |0          |0             |1          |9.84    |14.395   |75          |0.0          |1         |7             |8        |2011-01-01 08:00:00  |8       |\n",
      "|1         |0          |0             |1          |13.12   |17.425   |76          |0.0          |8         |6             |14       |2011-01-01 09:00:00  |9       |\n",
      "--------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from snowflake.snowpark.functions import hour\n",
    "df_table = df_table.with_column(\"hour\", hour(\"DATETIME\"))\n",
    "df_table.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "6abc230b-e622-4016-9a01-11269c517361",
   "metadata": {
    "id": "6abc230b-e622-4016-9a01-11269c517361",
    "outputId": "7cb99f51-c110-4bd4-ee08-f772f3ac5f0d"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|\"SEASON\"  |\"HOLIDAY\"  |\"WORKINGDAY\"  |\"WEATHER\"  |\"TEMP\"  |\"ATEMP\"  |\"HUMIDITY\"  |\"WINDSPEED\"  |\"CASUAL\"  |\"REGISTERED\"  |\"COUNT\"  |\"DATETIME\"           |\"HOUR\"  |\"MONTH\"  |\n",
      "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|1         |0          |0             |1          |9.84    |14.395   |81          |0.0          |3         |13            |16       |2011-01-01 00:00:00  |0       |1        |\n",
      "|1         |0          |0             |1          |9.02    |13.635   |80          |0.0          |8         |32            |40       |2011-01-01 01:00:00  |1       |1        |\n",
      "|1         |0          |0             |1          |9.02    |13.635   |80          |0.0          |5         |27            |32       |2011-01-01 02:00:00  |2       |1        |\n",
      "|1         |0          |0             |1          |9.84    |14.395   |75          |0.0          |3         |10            |13       |2011-01-01 03:00:00  |3       |1        |\n",
      "|1         |0          |0             |1          |9.84    |14.395   |75          |0.0          |0         |1             |1        |2011-01-01 04:00:00  |4       |1        |\n",
      "|1         |0          |0             |2          |9.84    |12.88    |75          |6.0032       |0         |1             |1        |2011-01-01 05:00:00  |5       |1        |\n",
      "|1         |0          |0             |1          |9.02    |13.635   |80          |0.0          |2         |0             |2        |2011-01-01 06:00:00  |6       |1        |\n",
      "|1         |0          |0             |1          |8.2     |12.88    |86          |0.0          |1         |2             |3        |2011-01-01 07:00:00  |7       |1        |\n",
      "|1         |0          |0             |1          |9.84    |14.395   |75          |0.0          |1         |7             |8        |2011-01-01 08:00:00  |8       |1        |\n",
      "|1         |0          |0             |1          |13.12   |17.425   |76          |0.0          |8         |6             |14       |2011-01-01 09:00:00  |9       |1        |\n",
      "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from snowflake.snowpark.functions import month\n",
    "df_table = df_table.with_column(\"month\", month(\"DATETIME\"))\n",
    "df_table.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "2c092194-e8ed-4b4d-a15f-d20b876f74a5",
   "metadata": {
    "id": "2c092194-e8ed-4b4d-a15f-d20b876f74a5",
    "outputId": "b84494a3-0205-4a81-b8da-fe962c13a9cd"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|\"SEASON\"  |\"HOLIDAY\"  |\"WORKINGDAY\"  |\"WEATHER\"  |\"TEMP\"  |\"ATEMP\"  |\"HUMIDITY\"  |\"WINDSPEED\"  |\"CASUAL\"  |\"REGISTERED\"  |\"COUNT\"  |\"DATETIME\"           |\"HOUR\"  |\"MONTH\"  |\"DATE\"      |\n",
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|1         |0          |0             |1          |9.84    |14.395   |81          |0.0          |3         |13            |16       |2011-01-01 00:00:00  |0       |1        |2011-01-01  |\n",
      "|1         |0          |0             |1          |9.02    |13.635   |80          |0.0          |8         |32            |40       |2011-01-01 01:00:00  |1       |1        |2011-01-01  |\n",
      "|1         |0          |0             |1          |9.02    |13.635   |80          |0.0          |5         |27            |32       |2011-01-01 02:00:00  |2       |1        |2011-01-01  |\n",
      "|1         |0          |0             |1          |9.84    |14.395   |75          |0.0          |3         |10            |13       |2011-01-01 03:00:00  |3       |1        |2011-01-01  |\n",
      "|1         |0          |0             |1          |9.84    |14.395   |75          |0.0          |0         |1             |1        |2011-01-01 04:00:00  |4       |1        |2011-01-01  |\n",
      "|1         |0          |0             |2          |9.84    |12.88    |75          |6.0032       |0         |1             |1        |2011-01-01 05:00:00  |5       |1        |2011-01-01  |\n",
      "|1         |0          |0             |1          |9.02    |13.635   |80          |0.0          |2         |0             |2        |2011-01-01 06:00:00  |6       |1        |2011-01-01  |\n",
      "|1         |0          |0             |1          |8.2     |12.88    |86          |0.0          |1         |2             |3        |2011-01-01 07:00:00  |7       |1        |2011-01-01  |\n",
      "|1         |0          |0             |1          |9.84    |14.395   |75          |0.0          |1         |7             |8        |2011-01-01 08:00:00  |8       |1        |2011-01-01  |\n",
      "|1         |0          |0             |1          |13.12   |17.425   |76          |0.0          |8         |6             |14       |2011-01-01 09:00:00  |9       |1        |2011-01-01  |\n",
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from snowflake.snowpark.functions import to_date\n",
    "df_table = df_table.with_column(\"date\", to_date(\"DATETIME\"))\n",
    "df_table.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "9add93d0-c0a3-47df-99ed-7dfab68a46ee",
   "metadata": {
    "id": "9add93d0-c0a3-47df-99ed-7dfab68a46ee",
    "outputId": "2c025fdf-103e-4322-85ba-15fa4503b82c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|\"SEASON\"  |\"HOLIDAY\"  |\"WORKINGDAY\"  |\"WEATHER\"  |\"TEMP\"  |\"ATEMP\"  |\"HUMIDITY\"  |\"WINDSPEED\"  |\"CASUAL\"  |\"REGISTERED\"  |\"COUNT\"  |\"DATETIME\"           |\"HOUR\"  |\"MONTH\"  |\"DATE\"      |\"WEEKDAY\"  |\n",
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|1         |0          |0             |1          |9.84    |14.395   |81          |0.0          |3         |13            |16       |2011-01-01 00:00:00  |0       |1        |2011-01-01  |6          |\n",
      "|1         |0          |0             |1          |9.02    |13.635   |80          |0.0          |8         |32            |40       |2011-01-01 01:00:00  |1       |1        |2011-01-01  |6          |\n",
      "|1         |0          |0             |1          |9.02    |13.635   |80          |0.0          |5         |27            |32       |2011-01-01 02:00:00  |2       |1        |2011-01-01  |6          |\n",
      "|1         |0          |0             |1          |9.84    |14.395   |75          |0.0          |3         |10            |13       |2011-01-01 03:00:00  |3       |1        |2011-01-01  |6          |\n",
      "|1         |0          |0             |1          |9.84    |14.395   |75          |0.0          |0         |1             |1        |2011-01-01 04:00:00  |4       |1        |2011-01-01  |6          |\n",
      "|1         |0          |0             |2          |9.84    |12.88    |75          |6.0032       |0         |1             |1        |2011-01-01 05:00:00  |5       |1        |2011-01-01  |6          |\n",
      "|1         |0          |0             |1          |9.02    |13.635   |80          |0.0          |2         |0             |2        |2011-01-01 06:00:00  |6       |1        |2011-01-01  |6          |\n",
      "|1         |0          |0             |1          |8.2     |12.88    |86          |0.0          |1         |2             |3        |2011-01-01 07:00:00  |7       |1        |2011-01-01  |6          |\n",
      "|1         |0          |0             |1          |9.84    |14.395   |75          |0.0          |1         |7             |8        |2011-01-01 08:00:00  |8       |1        |2011-01-01  |6          |\n",
      "|1         |0          |0             |1          |13.12   |17.425   |76          |0.0          |8         |6             |14       |2011-01-01 09:00:00  |9       |1        |2011-01-01  |6          |\n",
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from snowflake.snowpark.functions import dayofweek\n",
    "df_table = df_table.with_column(\"weekday\", dayofweek(\"DATETIME\"))\n",
    "df_table.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "388bb21a",
   "metadata": {},
   "source": [
    "### Outlier Analysis\n",
    "\n",
    "* Section provides code snippets to Visualize outliers in dataset\n",
    "* Code snippets encompasses mechanism to remove outliers from dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "ccac30c8-b5f2-48f6-988a-4e9a85f62a56",
   "metadata": {
    "id": "ccac30c8-b5f2-48f6-988a-4e9a85f62a56",
    "outputId": "0adb5aa5-7f84-4155-fbcc-c754ff5c2a09"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "191.574132\n",
      "181.14445382898148\n",
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|\"SEASON\"  |\"HOLIDAY\"  |\"WORKINGDAY\"  |\"WEATHER\"  |\"TEMP\"  |\"ATEMP\"  |\"HUMIDITY\"  |\"WINDSPEED\"  |\"CASUAL\"  |\"REGISTERED\"  |\"COUNT\"  |\"DATETIME\"           |\"HOUR\"  |\"MONTH\"  |\"DATE\"      |\"WEEKDAY\"  |\n",
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|1         |0          |1             |1          |28.7    |31.82    |28          |6.0032       |140       |642           |782      |2012-03-14 17:00:00  |17      |3        |2012-03-14  |3          |\n",
      "|1         |0          |1             |1          |28.7    |31.82    |32          |0.0          |102       |647           |749      |2012-03-14 18:00:00  |18      |3        |2012-03-14  |3          |\n",
      "|1         |0          |1             |1          |27.06   |31.06    |44          |19.0012      |98        |648           |746      |2012-03-15 18:00:00  |18      |3        |2012-03-15  |4          |\n",
      "|1         |0          |1             |1          |26.24   |31.06    |57          |16.9979      |120       |681           |801      |2012-03-19 18:00:00  |18      |3        |2012-03-19  |1          |\n",
      "|2         |0          |1             |1          |25.42   |30.305   |17          |12.998       |123       |634           |757      |2012-04-03 17:00:00  |17      |4        |2012-04-03  |2          |\n",
      "|2         |0          |1             |1          |24.6    |30.305   |26          |11.0014      |139       |661           |800      |2012-04-03 18:00:00  |18      |4        |2012-04-03  |2          |\n",
      "|2         |0          |1             |1          |27.06   |31.06    |41          |19.9995      |99        |645           |744      |2012-04-04 17:00:00  |17      |4        |2012-04-04  |3          |\n",
      "|2         |0          |1             |1          |27.06   |31.06    |41          |16.9979      |113       |646           |759      |2012-04-04 18:00:00  |18      |4        |2012-04-04  |3          |\n",
      "|2         |0          |1             |1          |20.5    |24.24    |31          |11.0014      |145       |677           |822      |2012-04-05 17:00:00  |17      |4        |2012-04-05  |4          |\n",
      "|2         |0          |1             |1          |22.96   |26.515   |21          |35.0008      |88        |656           |744      |2012-04-10 17:00:00  |17      |4        |2012-04-10  |2          |\n",
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "\n"
     ]
    }
   ],
   "source": [
    "#Removing Outliers\n",
    "from snowflake.snowpark.functions import mean, stddev, abs, date_part\n",
    "\n",
    "mean_value = df_table.select(mean(\"count\")).collect()[0][0]\n",
    "print(mean_value)\n",
    "\n",
    "std_value = df_table.select(stddev(\"count\")).collect()[0][0]\n",
    "print(std_value)\n",
    "\n",
    "df_without_outlier = df_table.filter((abs(df_table[\"count\"] - mean_value)) >= (3 * std_value))\n",
    "df_without_outlier.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "FSjDHuGe7mEQ",
   "metadata": {
    "id": "FSjDHuGe7mEQ",
    "outputId": "64cec763-fdc9-4dba-9fc5-a38628439dd1"
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAggAAAGwCAYAAADMjZ3mAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAeA0lEQVR4nO3df5BV5X348c/u4i6LsrsgsgsIyCJIRDTRNARN0JnQULVq23RiLfGrsZFR11ZiYoyjBm00Jk1rJ00lrdPWTJRotaOm4xCNUQK1WfBHRMQfCIpigkAS3F0M6MLe5/tHhluvDyou+3tfrxkm7jnn3nOee+558t699+6WpZRSAAC8TXlvHwAA0PcIBAAgIxAAgIxAAAAyAgEAyAgEACAjEACAzJDO3rBQKMSmTZti+PDhUVZW1pXHBOyDlFJs3749xo4dG+Xl/aP1zRvQ+/Z17uh0IGzatCnGjx/f2ZsDXeTVV1+NQw89tLcPY5+YN6DveL+5o9OBMHz48OIOampqOns3QCe1tbXF+PHji9dif2DegN63r3NHpwNhz48Ha2pqXOjQi/rTj+rNG9B3vN/c0T9euAQAepRAAAAyAgEAyAgEACAjEACAjEAAADICAQDICAQAICMQAICMQAAAMgIBAMgIBAAgIxAAgIxAAAAyAgEAyAgEACAjEACAjEAAADICAQDICAQAICMQAICMQAAAMgIBAMgIBAAgIxAAgIxAAAAyAgEAyAgEACAjEACAjEAAADICAQDICAQAICMQAIDMkN4+gD22bNkSra2tvX0YXaK2tjbq6+t7+zCAThpI81FXMa8NPn0iELZs2RKfO/v/xa72t3r7ULrEAZVVcdutP3AxQT800OajrmJeG3z6RCC0trbGrva3YmfjiVEYWtsl91m+syWqNyyPnZNmR6G6rkvuc5/2+2ZrxEvLorW11YUE/VB3zEed1VvzWHYc5rVBqU8Ewh6FobVROHBU195ndV2X3ycw8HXHfNRZ5jF6gzcpAgAZgQAAZAQCAJARCABARiAAABmBAABkBAIAkBEIAEBGIAAAGYEAAGQEAgCQEQgAQEYgAAAZgQAAZAQCAJARCABARiAAABmBAABkBAIAkBEIAEBGIAAAGYEAAGQEAgCQEQgAQEYgAAAZgQAAZAQCAJARCABARiAAABmBAABkBAIAkBEIAEBGIAAAGYEAAGQEAgCQEQgAQEYgAAAZgQAAZAQCAJARCABARiAAABmBAABkBAIAkBEIAEBGIAAAGYEAAGQEAgCQEQgAQEYgAAAZgQAAZAQCAJARCABARiAAABmBAABkBAIAkBEIAEBGIAAAGYEAAGQEAgCQEQgAQEYgAAAZgQAAZAQCAJARCABARiAAABmBAABkBAIAkBEIAEBGIAAAGYEAAGS6PRDefPPNeOGFF+LNN9/s7l3RD3l+8G48N2Dveura6PZA2LhxY8yfPz82btzY3buiH/L84N14bsDe9dS14SUGACAjEACAjEAAADICAQDICAQAICMQAICMQAAAMgIBAMgIBAAgIxAAgIxAAAAyAgEAyAgEACAjEACAjEAAADICAQDICAQAICMQAICMQAAAMgIBAMgIBAAgIxAAgIxAAAAyAgEAyAgEACAjEACAjEAAADICAQDICAQAICMQAICMQAAAMgIBAMgIBAAgIxAAgIxAAAAyAgEAyAgEACAjEACAjEAAADICAQDICAQAICMQAICMQAAAMgIBAMgIBAAgIxAAgIxAAAAyAgEAyAgEACAjEACAjEAAADICAQDICAQAICMQAICMQAAAMgIBAMgIBAAgIxAAgIxAAAAyAgEAyAgEACAjEACAjEAAADICAQDICAQAICMQAICMQAAAMgIBAMgM6e0DYPBqbW2Na665JiIi5s+f3y37qK6ujo6Ojmhvby9ZXlZWFimliIgoLy+PQqGwz/f59ttWVFTEuHHjolAoxG9+85vo6OiIYcOGxbhx4+ITn/hETJkyJVpaWqKlpSXq6upi1KhRMX369Hj66adj1apVERHx4Q9/OGbMmBFPP/10/OIXv4itW7fG6NGj49hjj40Pf/jDUVFR0TUPBjBgdXR0xOrVq2Pbtm0xcuTIOProo/d77hAI9Ip58+bFr371q27fz86dO/e6fM//wUfEB4qDd962o6MjNm7cWLK+tbU1Wltb49lnn93r7d8ZJLfeemtJdOyxePHiqKuri0svvTRmz579gY4RGDyWL18eixYtis2bNxeXNTQ0xEUXXbRfc4eXGOhxPRUHfclHP/rRmDJlSkT8X5Cce+65ce6550bE/0XH+PHj42/+5m/iyCOPjIiIlpaWWLhwYSxfvrznDxro85YvXx4LFy6MxsbGuOmmm2LJkiVx0003RWNj437PHQKBHtXa2jro4iAi4he/+EW0tbVFeXl5VFZWxsc//vF44IEHYsmSJXHAAQdEWVlZlJeXx65du+KMM86If/7nf45Zs2ZFZWVlVFZWxve+973o6Ojo7WEAfUihUIhFixbFrFmz4rrrrovp06fHsGHDYvr06XHdddfFrFmz9mvu2OeXGN5666146623il+3tbV9oB298sornVrXXw3EMXWFb33rW719CD1i9OjRsXXr1uLXhUIhtmzZEhER7e3tMXPmzFixYkXJbVJKsXnz5li9enV85CMfic997nPR3NwcERGvvfZacXl/sr/zRkTPX0uu3Xfnsekb9pyHdevWxebNm+Pqq6+O8vLS7/fLy8tj3rx50dTU1Om5Y58D4YYbbohrr732A+9gj+uvv77Tt+2PBtt4KdXY2FgSCO9UVVX1ruu2bdsWERGTJk3a6/L+ZH/njQjXUl/iXPQtra2tEZHPFXvsWd7ZuWOfA+GKK66ISy+9tPh1W1tbjB8/fp93dOWVV8bEiRP3uu6VV14ZcE+89xrvYPatb30rXnzxxd4+jG730ksvvef6t39X/U4jR46MiIgNGzbsdXl/sr/zRkTPX0sDcT7qKua1vmHPc7S2tjYifj9XTJ8+PdtuzxzS2bljnwOhqqrqPb/reT8TJ06MqVOndvr2/c1gG+++uvHGG+OMM87o7cPodu/86UF5eXkccsgh8etf/zqGDBkSK1eujDFjxkRHR0e8/vrrsXv37igrK4vRo0fH0UcfHYVCIW677baorKyMsrKy4seW+pv9nTciXEt9iXPRt0yZMiUaGhpi8eLFcd1115W8zFAoFGLx4sUxZsyYTs8d3qRIj6qtrY1x48b19mH0uGOPPTZqamqiUChEe3t7rFixIv7wD/8wTj755Ni1a1eklKJQKMSQIUPi3nvvjYsvvjiam5ujvb092tvb48ILL/T7EIAS5eXlcdFFF0Vzc3NcddVV8cwzz8SOHTvimWeeiauuuiqam5v3a+7wexDocYsXLx50H3V8/PHHi/+95/cg/OAHPygu2/N7EH75y1/Gd7/73eLyESNGxBe/+EW/BwHYq9mzZ8e1114bixYtiqampuLyMWPGxLXXXrtfc4dAoFcsXrw4Wltb48ILL4xNmzZ12378JkVgoJs9e3accMIJfpMiA0dtbW1cc801MX/+/Lj55psH1Wubxx13XBx33HHvuwxgX1RU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1lRfX5/mzZuX1qxZk26//fZUXV2d/vVf/7WnhjnoXH/99enggw9O9913X9qwYUO666670kEHHZS+853vFLfpinM7GH32s59NRx55ZFq2bFlat25dWrhwYaqpqUm//OUvU0oe1+7WbYHwsY99LDU1NRW/7ujoSGPHjk033HBDd+2yy2zdujVFRFq2bFlx2YknnpguueSSd73NkiVLUnl5edq8eXNx2fe+971UU1OT3nrrre483L1auHBhOuaYY/a6rqWlJR1wwAHprrvuKi577rnnUkSk5ubmlFLfG887XXLJJWny5MmpUCiklPrf+XlnIBQKhdTQ0JC+/e1vF5e1tLSkqqqqdPvtt6eUUnr22WdTRKTHHnusuM2Pf/zjVFZWln71q1+llFJatGhRGjFiRMmYLr/88nTEEUd084gGr1NPPTWdd955Jcv+7M/+LM2bNy+l1HXndrDZsWNHqqioSPfdd1/J8mOPPTZdeeWVHtce0C0vMbS3t8cTTzwRc+bMKS4rLy+POXPmRHNzc3fssku1trZGRMTIkSNLli9evDhGjRoVRx11VFxxxRWxY8eO4rrm5uaYMWNG1NfXF5fNnTs32tra4plnnumZA3+HdevWxdixY6OxsTHmzZsXGzdujIiIJ554Inbt2lVyfqZNmxYTJkwonp++OJ492tvb47bbbovzzjuv5A/+9Lfz83YbNmyIzZs3l5yT2tramDlzZsk5qauri49+9KPFbebMmRPl5eWxcuXK4jazZ8+OysrK4jZz586NtWvXxuuvv95Doxlcjj/++HjooYfihRdeiIiIp556Kh555JE4+eSTI6Lrzu1gs3v37ujo6IihQ4eWLK+uro5HHnnE49oDOv3Hmt7Lb37zm+jo6CiZjCMi6uvr4/nnn++OXXaZQqEQCxYsiBNOOCGOOuqo4vK//Mu/jIkTJ8bYsWNj9erVcfnll8fatWvj7rvvjoiIzZs373W8e9b1tJkzZ8b3v//9OOKII+K1116La6+9Nj75yU/GmjVrYvPmzVFZWRl1dXXZ8e451r42nre79957o6WlJc4999zisv52ft5pzzHs7Rjffk5Gjx5dsn7IkCExcuTIkm0mTZqU3ceedSNGjOiW4x/MvvrVr0ZbW1tMmzYtKioqoqOjI66//vqYN29eRHTduR1shg8fHrNmzYqvf/3r8aEPfSjq6+vj9ttvj+bm5jj88MM9rj2gWwKhP2tqaoo1a9bEI488UrJ8/vz5xf+eMWNGjBkzJj71qU/Fiy++GJMnT+7pw3xfe757iYg4+uijY+bMmTFx4sS48847o7q6uhePbP/9+7//e5x88skxduzY4rL+dn4YOO68885YvHhx/PCHP4zp06fHqlWrYsGCBTF27Ng455xzevvw+rVbb701zjvvvBg3blxUVFTEscceG2eddVY88cQTvX1og0K3vMQwatSoqKioyN4Vv2XLlmhoaOiOXXaJiy++OO67775YunTp+/5J2pkzZ0ZExPr16yMioqGhYa/j3bOut9XV1cXUqVNj/fr10dDQEO3t7dHS0lKyzdvPT18dzyuvvBI//elP4wtf+MJ7btffzs+eY3iva6ahoSG2bt1asn737t2xbdu2Pn/eBrLLLrssvvrVr8Zf/MVfxIwZM+Lss8+OL37xi3HDDTdERNed28Fo8uTJsWzZsnjjjTfi1VdfjUcffTR27doVjY2NHtce0C2BUFlZGccdd1w89NBDxWWFQiEeeuihmDVrVnfscr+klOLiiy+Oe+65Jx5++OHsR7R7s2rVqoiIGDNmTEREzJo1K55++umSJ+ODDz4YNTU1ceSRR3bLcX8Qb7zxRrz44osxZsyYOO644+KAAw4oOT9r166NjRs3Fs9PXx3PLbfcEqNHj45TTz31Pbfrb+dn0qRJ0dDQUHJO2traYuXKlSXnpKWlpeS7p4cffjgKhUIxiGbNmhXLly+PXbt2Fbd58MEH44gjjvDyQjfZsWNHlJeXTqUVFRVRKBQiouvO7WB24IEHxpgxY+L111+PBx54IM444wyPa0/ornc/3nHHHamqqip9//vfT88++2yaP39+qqurK3kXeV9x4YUXptra2vSzn/2s5GNyO3bsSCmltH79+vS3f/u36fHHH08bNmxIP/rRj1JjY2OaPXt28T72fIzu05/+dFq1alW6//770yGHHNJrHwv80pe+lH72s5+lDRs2pP/93/9Nc+bMSaNGjUpbt25NKf3+Y44TJkxIDz/8cHr88cfTrFmz0qxZs/rseFL6/SdhJkyYkC6//PKS5f3l/Gzfvj09+eST6cknn0wRkW688cb05JNPpldeeSWl9PuPbNXV1aUf/ehHafXq1emMM87Y60e2PvKRj6SVK1emRx55JE2ZMqXkI1stLS2pvr4+nX322WnNmjXpjjvuSMOGDfMxx250zjnnpHHjxhU/5nj33XenUaNGpa985SvFbbri3A5G999/f/rxj3+cXnrppfSTn/wkHXPMMWnmzJmpvb09peRx7W7dFggppfTd7343TZgwIVVWVqaPfexjacWKFd25u06LiL3+u+WWW1JKKW3cuDHNnj07jRw5MlVVVaXDDz88XXbZZSWfs08ppZdffjmdfPLJqbq6Oo0aNSp96UtfSrt27eqFEaV05plnpjFjxqTKyso0bty4dOaZZ6b169cX1+/cuTNddNFFacSIEWnYsGHpT//0T9Nrr71Wch99aTwppfTAAw+kiEhr164tWd5fzs/SpUv3+jw755xzUkq//zjc1Vdfnerr61NVVVX61Kc+lY31t7/9bTrrrLPSQQcdlGpqatLnP//5tH379pJtnnrqqfSJT3wiVVVVpXHjxqVvfvObPTXEQamtrS1dcsklacKECWno0KGpsbExXXnllSUfNe2qczvY/Od//mdqbGxMlZWVqaGhITU1NaWWlpbieo9r9/LnngGAjL/FAABkBAIAkBEIAEBGIAAAGYEAAGQEAgCQEQgAQEYgAAAZgQAAZARCP7F58+b467/+62hsbIyqqqoYP358nHbaaSV/qOTnP/95nHLKKTFixIgYOnRozJgxI2688cbo6OgobvPyyy9HWVlZ8Y8Zvd1JJ50UCxYsKH592GGHRVlZWaxYsaJkuwULFsRJJ51Uss27/Tv33HO78mEAPgDzBvtjSG8fAO/v5ZdfjhNOOCHq6uri29/+dsyYMSN27doVDzzwQDQ1NcXzzz8f99xzT3z2s5+Nz3/+87F06dKoq6uLn/70p/GVr3wlmpub484774yysrIPvO+hQ4fG5ZdfHsuWLdvr+scee6w4kfz85z+Pz3zmM7F27dqoqamJiIjq6urODxzoNPMG+0sg9AMXXXRRlJWVxaOPPhoHHnhgcfn06dPjvPPOi9/97ndx/vnnx+mnnx4333xzcf0XvvCFqK+vj9NPPz3uvPPOOPPMMz/wvufPnx//8i//EkuWLIlTTjklW3/IIYcU/3vkyJERETF69Oioq6v7wPsCuo55g/3lJYY+btu2bXH//fdHU1NTyUW+R11dXfzkJz+J3/72t/HlL385W3/aaafF1KlT4/bbb+/U/idNmhQXXHBBXHHFFcW/bw/0beYNuoJA6OPWr18fKaWYNm3au27zwgsvRETEhz70ob2unzZtWnGbzrjqqqtiw4YNsXjx4k7fB9BzzBt0BYHQx32Qv8bdXX+5+5BDDokvf/nL8bWvfS3a29u7ZR9A1zFv0BUEQh83ZcqUKCsri+eff/5dt5k6dWpERDz33HN7Xf/cc88Vt9nzJqDW1tZsu5aWlqitrd3rfVx66aWxc+fOWLRo0Qc6fqDnmTfoCgKhjxs5cmTMnTs3brrppvjd736XrW9paYlPf/rTMXLkyPiHf/iHbP1///d/x7p16+Kss84q3t+oUaPiiSeeKNmura0t1q9fX5wQ3umggw6Kq6++Oq6//vrYvn17F4wM6C7mDbpEos978cUXU0NDQzryyCPTf/3Xf6UXXnghPfvss+k73/lOmjZtWkoppbvuuitVVFSk888/Pz311FNpw4YN6d/+7d/SiBEj0p//+Z+nQqFQvL9vfOMb6eCDD0633XZbWr9+fVq5cmX64z/+43TYYYelHTt2FLebOHFi+sd//Mfi1+3t7Wny5Mlp6NCh6cQTT8yOc+nSpSki0uuvv95dDwWwj8wb7C+B0E9s2rQpNTU1pYkTJ6bKyso0bty4dPrpp6elS5cWt1m+fHmaO3duqqmpSZWVlWn69Onp7//+79Pu3btL7mv37t3pn/7pn9KMGTPSsGHD0qGHHprOPPPMtGHDhpLt3nmhp5TSD3/4wxQRLnToB8wb7I+ylLrpHSoAQL/lPQgAQEYgAAAZgQAAZAQCAJARCABARiAAABmBAABkBAIAkBEIAEBGIAAAGYEAAGT+P7GO/9H/LZU8AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "f, axes = plt.subplots(1, 2)\n",
    "sns.boxplot(x=df_table.to_pandas()['COUNT'], ax=axes[0])\n",
    "sns.boxplot(x=df_without_outlier.to_pandas()['COUNT'], ax=axes[1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4b360f6",
   "metadata": {},
   "source": [
    "### Correlation Analysis\n",
    "\n",
    "* Section cover snowpark default option to calculate correlation score\n",
    "* Also provides code snippet - by converting to pandas dataframe"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "7ffe6d64-11f4-45df-b0e2-b4bde6966be5",
   "metadata": {
    "id": "7ffe6d64-11f4-45df-b0e2-b4bde6966be5",
    "outputId": "b1226e6e-6e81-4d86-bfe8-8773b54c6e07"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Correlation between temp and atemp is 0.8867069954671704\n",
      "Correlation between temp and casual is 0.27439586514534764\n",
      "Correlation between temp and registered is -0.11344260141130262\n",
      "Correlation between temp and humidity is -0.22209903468060024\n",
      "Correlation between temp and windspeed is -0.00282142677568521\n",
      "Correlation between temp and count is 0.090925961635169\n",
      "Correlation between atemp and casual is 0.2147513221104753\n",
      "Correlation between atemp and registered is -0.0797053102397002\n",
      "Correlation between atemp and humidity is -0.13160630310282323\n",
      "Correlation between atemp and windspeed is -0.029077657967140087\n",
      "Correlation between atemp and count is 0.08216007024581092\n",
      "Correlation between casual and registered is -0.5753920258798173\n",
      "Correlation between casual and humidity is -0.4627632395376554\n",
      "Correlation between casual and windspeed is 0.016935938842728943\n",
      "Correlation between casual and count is 0.13515372607423487\n",
      "Correlation between registered and humidity is 0.230233618846889\n",
      "Correlation between registered and windspeed is 0.0008793332730113127\n",
      "Correlation between registered and count is 0.7326070538152109\n",
      "Correlation between humidity and windspeed is -0.16794858261525875\n",
      "Correlation between humidity and count is -0.10620107926342576\n",
      "Correlation between windspeed and count is 0.015159652778417163\n"
     ]
    }
   ],
   "source": [
    "#Correlation\n",
    "column_list = [\"temp\",\"atemp\",\"casual\",\"registered\",\"humidity\",\"windspeed\",\"count\"]\n",
    "for i in range(0, len(column_list) - 1):\n",
    "    for j in range( i + 1, len(column_list)):\n",
    "        correlation = df_without_outlier.stat.corr(column_list[i], column_list[j])\n",
    "        text = f\"Correlation between {column_list[i]} and {column_list[j]} is {correlation}\"\n",
    "        print(text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "fyUtVMOW63V0",
   "metadata": {
    "id": "fyUtVMOW63V0",
    "outputId": "43581513-63b1-4427-b7ee-425380fded17"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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PhhxJiIiIiIi0jYCxlA1wY4zERERERGRthF+XouDfe54m4GIiIiIiIgoH4w4ExERERERaRkBh2prhGeLiIiIiIiIKB+MOH9hnJYtKe4qUAFY6pkXdxWogB74tizuKlABrGjxV3FXgQrAztWpuKtABTBkgGtxV4EKyFg3vbirQAViVtwV+DCc46wRRpyJiIiIiIiI8sGIMxERERERkbbhHGeN8GwRERERERER5YMRZyIiIiIiIm0j4BxnTbDjTEREREREpG2EHHysCZ4tIiIiIiIionww4kxERERERKRtuDiYRni2iIiIiIiIiPLBiDMREREREZG2EXJxME0w4kxERERERESUD0aciYiIiIiItA3nOGuEZ4uIiIiIiIgoH4w4ExERERERaRsB5zhrgh1nIiIiIiIibSPk4GNN8GwRERERERER5YMRZyIiIiIiIm3DodoaYcSZiIiIiIiIKB+MOBMREREREWkbPo5KIzxbRERERERERPlgxJmIiIiIiEjbcFVtjfBsEREREREREeWDEWciIiIiIiJtw1W1NcKOMxERERERkbbh4mAa4dkiIiIiIiIiygcjzkRERERERNqGQ7U1wogzERERERERUT6+2IhzdHQ0fv/9dxw4cACvX7+Gvb09/P39MXr0aDRt2lSZLygoCL/88gtmzZqFn376SaWM7OxszJ07F2vWrMHLly9hZGQELy8vDBgwAP379wcANGrUCP7+/li0aJHKsWvWrMHo0aMhEolU0iMjI+Hh4QFvb2/cvXs3V70FAgF27dqFtm3bFsp5+BztOnAYm3fvQ0KiGGXdymDUwD4o5+2pNu++I8dx+OQZvHgZCQDwKeuOAT06q+Rv+G1ntccO7tUNXb5vU/gN0BL79u3D9h07kJiYCA93dwwZMgQ+Pj5q8x4KDcXx48fx8uVLAICnpyd69+qlkv/8+fM4cPAgnj59iqSkJCxdsgRly5b9JG0hwLpeNXiM7QeLKhVh6GSPa+2GImbv8eKultbp180NbZo5wsxEF3ceSDBv+RNERqXlmb9vF1f07eqmkvYyMhXdhlxVvra21MPQvmVR3d8KxkY6iHidirVbI3D6QlxRNaPE69LKGoF1LGBiJMTD5+n4c8tbRMVmFujY77+yQo9vbbHvZCJCdqheAx93Q3RrbQMvN0PIZHK8eJ2B6cteIyNTXhTNKFHOhG7C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SPt8RkO1vwQ8W0RERERERET5YMSZiIiIiIhIy8g5VFsjjDgTERERERER5YMRZyIiIiIiIm3DOc4a4dkiIiIiIiIiygcjzkRERERERFpGDs5x1gQjzkRERERERET5YMSZiIiIiIhIy8g5x1kj7DgTERERERFpG3acNcKzRURERERERJQPRpyJiIiIiIi0jFzAxcE0wYgzERERERERUT4YcSYiIiIiItIyXBxMM+w4f2EOvgko7ipQAejryYu7ClRAK1r8VdxVoAKYGDqwuKtABVDhwb7irgIVwH0Jh2d+KUqtGlPcVaCCmL2uuGtAnwA7zkRERERERNqGc5w1wvg8ERERERERUT4YcSYiIiIiItIynOOsGXaciYiIiIiItIwcHKqtCd5mICIiIiIiIsoHI85ERERERERahkO1NcOzRURERERERJQPRpyJiIiIiIi0DR9HpRFGnImIiIiIiIjywYgzERERERGRlpEzhqoRni0iIiIiIiKifDDiTEREREREpGXknOOsEXaciYiIiIiItAwfR6UZni0iIiIiIiKifDDiTEREREREpGXk4FBtTTDiTERERERERJQPRpyJiIiIiIi0DOc4a4Zni4iIiIiIiCgfjDgTERERERFpGT6OSjOMOBMRERERERHlgxFnIiIiIiIiLcNVtTXDjjMREREREZGW4eJgmuHZIiIiIiIiIsoHI85ERERERERahkO1NcOIMxEREREREVE+GHEmIiIiIiLSMpzjrBmNOs69e/fG33//rThQVxelS5dGhw4dMH36dBgaGgIABHk8D2zTpk3o3LkzAEAul2PVqlUICQnBvXv3IJPJ4OrqisDAQIwYMQKenp4AgKlTp2L37t0ICwsDAKSmpmLGjBnYunUrXr9+DTMzM5QvXx5jxoyBn58f3N3d863/6tWr4ebmhsaNG6vdHxUVBUdHR0ydOhXTpk0DAAiFQjg5OeHrr7/GrFmzYG1trczv5uaGly9f5ionKCgIEyZMQHh4uEqdTE1NUaZMGTRq1AijR4+Gl5dXvvX9Usnlcpzb/z/cOrcN0jQJnD2qoFnXqbC2d8vzmFdPruLy0WDERNxFsjgW3w1aBm//QJU8j24eQdjZzYiOuIf0FBF6T9oNB5dyRdyakksul+P0niW4eXYb0lMlcPGsgq+7T4GNg1u+x109sQEXDwcjWRwHBxdftOjy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jAsXLqB27ZxHzY0bNw6nT5/G5cuX8T5Dhw7F4cOHce/ePRgaGhZK/d/FCQNERERERERUqCZOnIgxY1RHaLwbbS4Ms2bNwubNm3Hq1Kki6zQD7DgTERERERFpnaJ+jrO6Ydnq2NraQkdHBzExMSrpMTExcHR0zPfYefPmYdasWTh27BgqV66cb96P9dGLgxEREREREdGXRQ5BkW4Fpa+vj6pVq6os7PXvQl//Hbr9rjlz5mDGjBkIDQ1FtWrVPupcFAQjzkRERERERFRsxowZg169eqFatWqoUaMGFi1ahJSUFOWi0z179oSzszOCghQLCM+ePRuTJ0/Gxo0b4ebmhujoaACAqakpTE1Ni6SO7DgTERERERFpmaIeqq2JTp06ITY2FpMnT0Z0dDT8/f0RGhoKBwcHAEBERETOc9QB/PHHH8jIyED79u1VylG3+FhhYceZiIiIiIiIitXw4cMxfPhwtftOnTql8jo8PLzoK/QOdpyJiIiIiIi0zOcUcf4ScHEwIiIiIiIionww4kxERERERKRl5HJGnDXBiDMRERERERFRPhhxJiIiIiIi0jKc46wZRpyJiIiIiIiI8sGIMxERERERkZZhxFkz7DgTERERERFpGXacNcOh2kRERERERET5YMSZiIiIiIhIy/BxVJphxJmIiIiIiIgoH4w4ExERERERaRkZ5zhrhBFnIiIiIiIionww4kxERERERKRluKq2ZhhxJiIiIiIiIsoHI85ERERERERahqtqa4YdZyIiIiIiIi3Dodqa4VBtIiIiIiIionww4kxERERERKRlOFRbM4w4ExEREREREeWDEWciIiIiIiItwznOmmHEmYiIiIiIiCgfjDh/YaLeZhd3FagAbK11irsKVEB2rk7FXQUqgAoP9hV3FagA7pVrU9xVoAJ4uvNhcVeBCiimxbrirgIVQJ/irsAH4hxnzTDiTERERERERJQPRpyJiIiIiIi0jKy4K/CFYceZiIiIiIhIy3CotmY4VJuIiIiIiIgoH4w4ExERERERaRk+jkozjDgTERERERER5YMRZyIiIiIiIi3DOc6aYcSZiIiIiIiIKB+MOBMREREREWkZznHWDCPORERERERERPlgxJmIiIiIiEjLyOTFXYMvCzvOREREREREWoZDtTXDodpERERERERE+WDEmYiIiIiISMvwcVSaYcSZiIiI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5/+Jag2/QseBOXX16NYpHNmcd77t/+N7AECTDqPRtFPJeitNUeEjjwUjEQTG6oqTeX9//hFnAizMPl3PBPowfgceFXURSA1Lx/NWVRzcq/J+r32kT+vxngdFXQRSk7Hh59OVlpQb5F3UJXg/+64Ubrviy3ol6//hYhNxJiIiIiIioo+D4dOCYcOZiIiIiIiolBHAHg0FoZF/EiIiIiIiIqLSixFnIiIiIiKiUoaDgxUMI85EREREREREKjDiTEREREREVMpwcLCCYcSZiIiIiIiISAVGnImIiIiIiEoZRpwLhhFnIiIiIiIiIhUYcSYiIiIiIiplpALf41wQbDgTERERERGVMuyqXTDsqk1ERERERESkAiPOREREREREpQwjzgXDiDMRERERERGRCow4ExERERERlTJSRpwLhBFnIiIiIiIiIhUYcSYiIiIiIiplBL6OqkAYcSYiIiIiIiJSgRFnIiIiIiKiUoajahcMI85EREREREREKjDiTEREREREVMpwVO2CYcOZiIiIiIiolGFX7YJhV20iIiIiIiIiFRhxJiIiIiIiKmUYcS4YRpyJiIiIiIiIVGDEmYiIiIiIqJTh4GAFw4gzERERERERkQqMOBMREREREZUyfMa5YNhwLmZquUiLugikhvSsoi4BqWvkMLuiLgKp4X6CpKiLQGp4vOdBUReB1ODU1a2oi0Bq0rxyp6iLQGrRKeoC0CfAhjMREREREVEpI2U8rkDYcCYiIiIiIipl2FW7YDg4GBEREREREZEKjDgTERERERGVMow4FwwjzkREREREREQqMOJMRERERERUykgZcS4QRpyJiIiIiIiIVGDEmYiIiIiIqJQRCv0hZ0kh5/9pMeJMREREREREpAIjzkRERERERKUMR9UuGDaciYiIiIiIShmptKhLULywqzYRERERERGRCow4ExERERERlTLsql0wjDgTERERERERqcCIMxERERERUSkjZcS5QBhxJiIiIiIiIlKBEWciIiIiIqJShs84FwwjzkRERERERFQsxMTEoG/fvjA2NoapqSmGDBmCpKQklenHjBkDV1dX6Ovro1KlShg7dizi4+MLtF1GnImIiIiIiEoZodAfcpYUSq59+/ZFeHg4jh8/jszMTAwaNAjDhw/Htm3bFKZ/9eoVXr16hSVLlsDd3R3Pnj3DiBEj8OrVK+zevVvt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ERERERERqcCIMxERERERUSkj5TPOBcKIMxEREREREZEKjDgTERERERGVMgIfci4QNpyJiIiIiIhKGUFa1CUoXthVm4iIiIiIiEgFRpyJiIiIiIhKGSm7ahcII85EREREREREKjDiTEREREREVMpwcLCCYcSZiIiIiIiISAVGnImIiIiIiEoZqZQR54JgxJmIiIiIiIhIBUaciYiIiIiIShk+4lwwbDgTERERERGVMgK7ahcIu2oTERERERERqcCIMxERERERUSkjZV/tAmHEmYiIiIiIiEgFRpyJiIiIiIhKGT7jXDCMOBMRERERERGpwIgzERERERFRKcOIc8Ew4kxERERERESkAiPOREREREREpQwDzgXDiDMRERERERGRCow4FzNmZVKKugikBqnA36SKizJaaUVdBFJDhT8mFHURSA2v2/5V1EUgNWheuVPURSA1ZderXtRFIHVkBhd1Cd4Ln3EuGDaciYiIiIiIShlBYMO5IBgWIyIiIiIiIlKBEWciIiIiIqJSRsqu2gXCiDMRERERERGRCow4ExERERERlTJ8xrlgGHEmIiIiIiIiUoERZyIiIiIiolKGr6MqGEaciYiIiIiIiFRgxJmIiIiIiKiUYcS5YNhwJiIiIiIiKmWkHBysQNhVm4iIiIiIiIqFmJgY9O3bF8bGxjA1NcWQIUOQlJSk1rqCIKBdu3aQSCTYt29fgbbLhjMREREREVEpI0iFQp0KS9++fXHv3j0cP34chw4dwpkzZzB8+HC11l22bBkkEsl7bZddtYmIiIiIiOizFxQUBD8/P1y5cgV169YFAPz2229o3749lixZAmtra6Xr3rx5E7/88guuXr2KChUqFHjbjDgTERERERGVMoIgFOqUnp6OhIQEmSk9Pf2DyhwYGAhTU1Ox0QwALVu2hIaGBi5duqR0vZSUFPTp0werVq2ClZXVe22bDWciIiIiIiL6qBYsWAATExOZacGCBR+UZ0REBMqVKyczT0tLC2ZmZoiIiFC63vfff4/GjRujS5cu771tdtUmIiIiIiIqZaSF/Doqn+k+mDBhgsw8XV1dhWmnTp2KRYsWqcwvKCjovcpx4MABnDp1Cjdu3Hiv9XOx4UxEREREREQfla6urtKG8rt++OEHDBw4UGUaR0dHWFlZ4c2bNzLzs7KyEBMTo7QL9qlTp/DkyROYmprKzO/W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SxeTOtXQ6ORf4mf3JdMAAGGb9+D2kKJ/BLG04hhCBSMReMSKlYsPGFUtDqRCienMUeKV0Uor6iKQGir88Xk8pkKqHWn7V/6JqMhVKJtR1EUgNWXXU/z4G31eOmQGF3UR3kunb4MKNf+D60rWGEX8756IiIiIiIhIhRLTVZuIiIiIiIjUUxIH8CpMjDgTERERERERqcCIMxERERERUSkjCNL8E5GIEWciIiIiIiIiFRhxJiIiIiIiKmX4jHPBMOJMREREREREpAIjzkRERERERKUMI84Fw4YzERERERFRKSPl4GAFwq7aRERERERERCow4kxERERERFTKsKt2wTDiTERERERERKQCI85ERERERESljCDlM84FwYgzERERERERkQqMOBMREREREZUyfMa5YBhxJiIiIiIiIlKBEWciIiIiIqJSRuB7nAuEDWciIiIiIqJSRsqu2gXCrtpEREREREREKjDiTEREREREVMrwdVQFw4gzERERERERkQqMOBMREREREZUyfB1VwTDiTERERERERKQCI85ERERERESlDF9HVTCMOBMRERERERGpwIgzERERERFRKcNnnAuGDWciIiIiIqJShq+jKhh21SYiIiIiIiJSQSIIAmP0VGTS09OxYMEC+Pj4QFdXt6iLQ0qwnooP1lXxwHoqHlhPxQfrqnhgPVFxxoYzFamEhASYmJggPj4exsbGRV0cUoL1VHywrooH1lPxwHoqPlhXxQPriYozdtUmIiIiIiIiUoENZyIiIiIiIiIV2HAmIiIiIiIiUoENZypSurq6mDlzJgeI+MyxnooP1lXxwHoqHlhPxQfrqnhgPVFxxsHBiIiIiIiIiFRgxJmIiIiIiIhIBTaciYiIiIiIiFRgw5mIiIiIiIhIBTaciYiIiIiIiFRgw5nei0QiUTnNmjULoaGhSpdfvHgRALBp0yZIJBJUqVJFbhu7du2CRCKBvb29OC83vUQigYaGBmxsbDBo0CC8efPmU+16sRIYGAhNTU106NABADBw4ECV9ZZ7rL28vBQuHzFihJj3u3WZKz09Hebm5pBIJAgICJBLL5FIYGJigiZNmuDUqVOFfgw+NxERERgzZgwcHR2hq6sLW1tbdOrUCSdPnpRJt2DBAmhqamLx4sVyeWRnZ2PhwoVwc3ODvr4+zMzM0KBBA/zxxx9iGi8vL4wfP15u3U2b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",
      "text/plain": [
       "<Figure size 1200x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "column_list_upper = [column.upper() for column in column_list]\n",
    "df_corr = df_without_outlier.select(*column_list_upper)\n",
    "corr_matrix = df_corr.to_pandas().corr()\n",
    "plt.figure(figsize=(12, 6))\n",
    "sns.heatmap(corr_matrix, cmap='coolwarm', annot=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a1db61b7",
   "metadata": {},
   "source": [
    "### LINEAR REGRESSION MODEL - Using Sklearn\n",
    "* Section demonstrates how traditionally ML models can be built & deployed using Stored Procedures\n",
    "* Section was included to explain how SNOWPARK ML eases model building process in the following section\n",
    "\n",
    "If Scikit-learn is not installed already, install with:\n",
    "```bash\n",
    "pip install -U scikit-learn or pip install scikit-learn==1.3.0 (Current version in snowflake)\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "b2c213c6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# %pip install scikit-learn==1.3.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "c9437531-ec38-448b-b314-80dff1da7ff7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Row(status='SNOWPARK_TEST_STAGE already exists, statement succeeded.')]"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Prepare your stage to save our models to:\n",
    "session.sql(\"CREATE STAGE IF NOT EXISTS SNOWPARK_DEFINITIVE_GUIDE.MY_SCHEMA.SNOWPARK_TEST_STAGE\").collect()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "189b747c-be3b-4abf-af82-f265a41f718a",
   "metadata": {
    "id": "189b747c-be3b-4abf-af82-f265a41f718a",
    "outputId": "6e261b0f-5abe-4000-bcbf-9c31011e2f66"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "The version of package 'snowflake-snowpark-python' in the local environment is 1.12.1, which does not fit the criteria for the requirement 'snowflake-snowpark-python'. Your UDF might not work when the package version is different between the server and your local environment.\n",
      "The version of package 'joblib' in the local environment is 1.3.2, which does not fit the criteria for the requirement 'joblib'. Your UDF might not work when the package version is different between the server and your local environment.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'Success'"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LinearRegression,Ridge,Lasso\n",
    "from sklearn.model_selection import GridSearchCV, train_test_split\n",
    "from sklearn import metrics\n",
    "from snowflake.snowpark.types import StringType\n",
    "import numpy as np\n",
    "import joblib\n",
    "\n",
    "def fit_linear_regressor(session:Session,\n",
    "    table_name: str, feature_list: list, target_col: str, category_variable_list: list)->str:\n",
    "    model = LinearRegression()\n",
    "    df = session.table(table_name).to_pandas()\n",
    "\n",
    "    for column in category_variable_list:\n",
    "        df[column] = df[column].astype(\"category\")\n",
    "    y_lables_log = np.log1p(df[target_col])\n",
    "    x_train, x_test, y_train, y_test = train_test_split(df, y_lables_log, test_size=0.3, random_state=42)\n",
    "\n",
    "    test_df = session.create_dataframe(x_test)\n",
    "    test_df.write.mode(\"overwrite\").save_as_table(\"lr_test\")\n",
    "\n",
    "    model.fit(x_train[feature_list], y_train)\n",
    "    joblib.dump(model, '/tmp/lr_model.joblib')\n",
    "\n",
    "    # upload into my_internal_stage in Snowflake\n",
    "    session.file.put(\n",
    "        \"/tmp/lr_model.joblib\", \"@snowpark_test_stage\", auto_compress=False, overwrite=True\n",
    "    )\n",
    "    return 'Success'\n",
    "\n",
    "session.sproc.register(\n",
    "    func = fit_linear_regressor,\n",
    "    is_permanent = True,\n",
    "    name = 'fit_linear_regressor',\n",
    "    replace = True,\n",
    "    return_type = StringType(),\n",
    "    stage_location = '@snowpark_test_stage',\n",
    "    packages=[\n",
    "            'snowflake-snowpark-python',\n",
    "            'scikit-learn',\n",
    "            'joblib',\n",
    "            'numpy'\n",
    "    ]\n",
    ")\n",
    "\n",
    "feature_list = [\"SEASON\", \"HOLIDAY\", \"WORKINGDAY\", \"WEATHER\", \"WEEKDAY\", \"HOUR\", \"HUMIDITY\", \"MONTH\", \"TEMP\", \"ATEMP\", \"WINDSPEED\"]\n",
    "category_variable_list = [\"HOUR\",\"WEEKDAY\",\"MONTH\",\"SEASON\",\"WEATHER\",\"HOLIDAY\",\"WORKINGDAY\"]\n",
    "table_name = \"model_data\"\n",
    "target_column = \"COUNT\"\n",
    "session.call(\"fit_linear_regressor\", table_name, feature_list, target_column, category_variable_list)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "7f9b96f0-101e-4c3a-ae6d-17632334969f",
   "metadata": {
    "id": "7f9b96f0-101e-4c3a-ae6d-17632334969f",
    "outputId": "2a0f47db-e2e9-4c0e-f7e4-309bc5492402"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "The version of package 'snowflake-snowpark-python' in the local environment is 1.12.1, which does not fit the criteria for the requirement 'snowflake-snowpark-python'. Your UDF might not work when the package version is different between the server and your local environment.\n",
      "The version of package 'joblib' in the local environment is 1.3.2, which does not fit the criteria for the requirement 'joblib'. Your UDF might not work when the package version is different between the server and your local environment.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<snowflake.snowpark.udf.UserDefinedFunction at 0x2116d4734c0>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "session.clear_imports()\n",
    "session.clear_packages()\n",
    "\n",
    "session.add_import(\"@snowpark_test_stage/lr_model.joblib\")\n",
    "\n",
    "from snowflake.snowpark.types import PandasDataFrame, PandasSeries\n",
    "\n",
    "\n",
    "\n",
    "def lr_predict_udf(df: PandasDataFrame[float, float, float, float, float, float, float, float, float, float, float]) -> PandasSeries[int]:\n",
    "    import joblib, sys, os\n",
    "    import pandas as pd\n",
    "\n",
    "    import_dir = sys._xoptions.get(\"snowflake_import_directory\")\n",
    "    with open(os.path.join(import_dir, 'lr_model.joblib'), 'rb') as model_file:\n",
    "        model = joblib.load(model_file)\n",
    "\n",
    "    return model.predict(df)\n",
    "\n",
    "session.udf.register(\n",
    "    func = lr_predict_udf,\n",
    "    is_permanent = True,\n",
    "    name = 'lr_predict_udf',\n",
    "    replace = True,\n",
    "    stage_location = '@snowpark_test_stage',\n",
    "    packages=[\n",
    "            'snowflake-snowpark-python',\n",
    "            'scikit-learn',\n",
    "            'joblib']\n",
    "\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "a3f2c2df-25c5-49f8-8415-53e79e2a7e59",
   "metadata": {
    "id": "a3f2c2df-25c5-49f8-8415-53e79e2a7e59",
    "outputId": "53daec79-02f1-4551-d390-1a0d46d028c5"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MAE For Linear Regression:  161.4779145653437\n"
     ]
    }
   ],
   "source": [
    "result_df = pd.DataFrame(session.sql(f'''\n",
    "    select lr_predict_udf(\"SEASON\", \"HOLIDAY\", \"WORKINGDAY\", \"WEATHER\", \"WEEKDAY\", \"HOUR\", \"HUMIDITY\", \"MONTH\", \"TEMP\", \"ATEMP\", \"WINDSPEED\" ) as predict\n",
    "    from lr_test\n",
    "''').collect())\n",
    "\n",
    "from sklearn.metrics import mean_absolute_error\n",
    "\n",
    "\n",
    "df_test = session.table(\"lr_test\")\n",
    "y_true = df_test.select([\"COUNT\"]).to_pandas()\n",
    "print (\"MAE For Linear Regression: \", mean_absolute_error(np.exp(np.log1p(y_true[\"COUNT\"])),np.exp(result_df[\"PREDICT\"])))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ca437ccc",
   "metadata": {},
   "source": [
    "### LINEAR REGRESSION MODEL - Using SNOWPARK ML Package\n",
    "* Section demonstates how SNOWPARKML library can be utilized to build ML models\n",
    "* Also delineates how it closely resembles Sklearn coding paradigm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "74fb7f24",
   "metadata": {},
   "outputs": [],
   "source": [
    "import snowflake.ml.modeling.preprocessing as snowml\n",
    "from snowflake.ml.modeling.pipeline import Pipeline\n",
    "import joblib\n",
    "\n",
    "df = session.table(\"BSD_TRAINING\") \n",
    "df = df.drop(\"DATETIME\",\"DATE\")\n",
    "CATEGORICAL_COLUMNS = [\"SEASON\",\"WEATHER\"]\n",
    "CATEGORICAL_COLUMNS_OHE = [\"SEASON_OE\",\"WEATHER_OE\"]\n",
    "MIN_MAX_COLUMNS = [\"TEMP\"]\n",
    "import numpy as np\n",
    "categories = {\n",
    "    \"SEASON\": np.array([1,2,3,4]),\n",
    "    \"WEATHER\": np.array([1,2,3,4]),\n",
    "}\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "624b27db",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|\"TEMP\"               |\"SEASON_OE\"  |\"WEATHER_OE\"  |\"SEASON\"  |\"HOLIDAY\"  |\"WORKINGDAY\"  |\"WEATHER\"  |\"ATEMP\"  |\"HUMIDITY\"  |\"WINDSPEED\"  |\"CASUAL\"  |\"REGISTERED\"  |\"COUNT\"  |\n",
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|0.22448979591836735  |0.0          |0.0           |1         |0          |0             |1          |14.395   |81          |0.0          |3         |13            |16       |\n",
      "|0.20408163265306123  |0.0          |0.0           |1         |0          |0             |1          |13.635   |80          |0.0          |8         |32            |40       |\n",
      "|0.20408163265306123  |0.0          |0.0           |1         |0          |0             |1          |13.635   |80          |0.0          |5         |27            |32       |\n",
      "|0.22448979591836735  |0.0          |0.0           |1         |0          |0             |1          |14.395   |75          |0.0          |3         |10            |13       |\n",
      "|0.22448979591836735  |0.0          |0.0           |1         |0          |0             |1          |14.395   |75          |0.0          |0         |1             |1        |\n",
      "|0.22448979591836735  |0.0          |1.0           |1         |0          |0             |2          |12.88    |75          |6.0032       |0         |1             |1        |\n",
      "|0.20408163265306123  |0.0          |0.0           |1         |0          |0             |1          |13.635   |80          |0.0          |2         |0             |2        |\n",
      "|0.18367346938775508  |0.0          |0.0           |1         |0          |0             |1          |12.88    |86          |0.0          |1         |2             |3        |\n",
      "|0.22448979591836735  |0.0          |0.0           |1         |0          |0             |1          |14.395   |75          |0.0          |1         |7             |8        |\n",
      "|0.3061224489795918   |0.0          |0.0           |1         |0          |0             |1          |17.425   |76          |0.0          |8         |6             |14       |\n",
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[PutResult(source='preprocessing_pipeline.joblib', target='preprocessing_pipeline.joblib.gz', source_size=3980, target_size=1808, source_compression='NONE', target_compression='GZIP', status='UPLOADED', message='')]"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "preprocessing_pipeline = Pipeline(\n",
    "    steps=[\n",
    "            (\n",
    "                \"OE\",\n",
    "                snowml.OrdinalEncoder(\n",
    "                    input_cols=CATEGORICAL_COLUMNS,\n",
    "                    output_cols=CATEGORICAL_COLUMNS_OHE,\n",
    "                    categories=categories\n",
    "                )\n",
    "            ),\n",
    "            (\n",
    "                \"MMS\",\n",
    "                snowml.MinMaxScaler(\n",
    "                    clip=True,\n",
    "                    input_cols=MIN_MAX_COLUMNS,\n",
    "                    output_cols=MIN_MAX_COLUMNS,\n",
    "                )\n",
    "            )\n",
    "    ]\n",
    ") \n",
    "\n",
    "\n",
    "PIPELINE_FILE = './preprocessing_pipeline.joblib'\n",
    "joblib.dump(preprocessing_pipeline, PIPELINE_FILE)\n",
    "transformed_df = preprocessing_pipeline.fit(df).transform(df)\n",
    "transformed_df.show()\n",
    "session.file.put(PIPELINE_FILE,\"@snowpark_test_stage\", overwrite=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "0f1cff33",
   "metadata": {},
   "outputs": [],
   "source": [
    "CATEGORICAL_COLUMNS = [\"SEASON\",\"WEATHER\"]\n",
    "CATEGORICAL_COLUMNS_OHE = [\"SEASON_OE\",\"WEATHER_OE\"]\n",
    "MIN_MAX_COLUMNS = [\"TEMP\",\"ATEMP\"]\n",
    "FEATURE_LIST = [\"HOLIDAY\",\"WORKINGDAY\",\"HUMIDITY\",\"TEMP\",\"ATEMP\",\"WINDSPEED\"]\n",
    "\n",
    "LABEL_COLUMNS = ['COUNT']\n",
    "OUTPUT_COLUMNS = ['PREDICTED_COUNT']\n",
    "\n",
    "PIPELINE_FILE = 'preprocessing_pipeline.joblib'\n",
    "preprocessing_pipeline = joblib.load(PIPELINE_FILE)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "74df7431",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|\"TEMP\"               |\"SEASON_OE\"  |\"WEATHER_OE\"  |\"SEASON\"  |\"HOLIDAY\"  |\"WORKINGDAY\"  |\"WEATHER\"  |\"ATEMP\"  |\"HUMIDITY\"  |\"WINDSPEED\"  |\"CASUAL\"  |\"REGISTERED\"  |\"COUNT\"  |\n",
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|0.23404255319148934  |0.0          |0.0           |1         |0          |0             |1          |14.395   |81          |0.0          |3         |13            |16       |\n",
      "|0.21276595744680848  |0.0          |0.0           |1         |0          |0             |1          |13.635   |80          |0.0          |8         |32            |40       |\n",
      "|0.21276595744680848  |0.0          |0.0           |1         |0          |0             |1          |13.635   |80          |0.0          |5         |27            |32       |\n",
      "|0.23404255319148934  |0.0          |0.0           |1         |0          |0             |1          |14.395   |75          |0.0          |3         |10            |13       |\n",
      "|0.23404255319148934  |0.0          |1.0           |1         |0          |0             |2          |12.88    |75          |6.0032       |0         |1             |1        |\n",
      "|0.21276595744680848  |0.0          |0.0           |1         |0          |0             |1          |13.635   |80          |0.0          |2         |0             |2        |\n",
      "|0.23404255319148934  |0.0          |0.0           |1         |0          |0             |1          |14.395   |75          |0.0          |1         |7             |8        |\n",
      "|0.3191489361702128   |0.0          |0.0           |1         |0          |0             |1          |17.425   |76          |0.0          |8         |6             |14       |\n",
      "|0.3617021276595745   |0.0          |0.0           |1         |0          |0             |1          |16.665   |81          |19.0012      |26        |30            |56       |\n",
      "|0.425531914893617    |0.0          |0.0           |1         |0          |0             |1          |21.21    |77          |19.0012      |29        |55            |84       |\n",
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "\n",
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|\"TEMP\"               |\"SEASON_OE\"  |\"WEATHER_OE\"  |\"SEASON\"  |\"HOLIDAY\"  |\"WORKINGDAY\"  |\"WEATHER\"  |\"ATEMP\"  |\"HUMIDITY\"  |\"WINDSPEED\"  |\"CASUAL\"  |\"REGISTERED\"  |\"COUNT\"  |\n",
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|0.23404255319148934  |0.0          |0.0           |1         |0          |0             |1          |14.395   |75          |0.0          |0         |1             |1        |\n",
      "|0.19148936170212763  |0.0          |0.0           |1         |0          |0             |1          |12.88    |86          |0.0          |1         |2             |3        |\n",
      "|0.3829787234042553   |0.0          |0.0           |1         |0          |0             |1          |19.695   |76          |16.9979      |12        |24            |36       |\n",
      "|0.46808510638297873  |0.0          |1.0           |1         |0          |0             |2          |22.725   |72          |19.9995      |47        |47            |94       |\n",
      "|0.46808510638297873  |0.0          |1.0           |1         |0          |0             |2          |22.725   |72          |19.0012      |35        |71            |106      |\n",
      "|0.425531914893617    |0.0          |1.0           |1         |0          |0             |2          |21.21    |82          |19.9995      |41        |52            |93       |\n",
      "|0.425531914893617    |0.0          |2.0           |1         |0          |0             |3          |21.21    |88          |16.9979      |6         |31            |37       |\n",
      "|0.40425531914893614  |0.0          |1.0           |1         |0          |0             |2          |20.455   |94          |15.0013      |11        |17            |28       |\n",
      "|0.46808510638297873  |0.0          |1.0           |1         |0          |0             |2          |22.725   |88          |19.9995      |15        |24            |39       |\n",
      "|0.44680851063829785  |0.0          |1.0           |1         |0          |0             |2          |21.97    |94          |16.9979      |1         |16            |17       |\n",
      "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "\n"
     ]
    }
   ],
   "source": [
    "bsd_train_df, bsd_test_df = df.random_split(weights=[0.7,0.3], seed=0)\n",
    "train_df = preprocessing_pipeline.fit(bsd_train_df).transform(bsd_train_df)\n",
    "test_df = preprocessing_pipeline.transform(bsd_test_df)\n",
    "train_df.show()\n",
    "test_df.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "69c7ad81",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "The version of package 'snowflake-snowpark-python' in the local environment is 1.12.1, which does not fit the criteria for the requirement 'snowflake-snowpark-python'. Your UDF might not work when the package version is different between the server and your local environment.\n",
      "The version of package 'xgboost' in the local environment is 1.7.6, which does not fit the criteria for the requirement 'xgboost==1.7.3'. Your UDF might not work when the package version is different between the server and your local environment.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|\"WINDSPEED\"  |\"TEMP\"               |\"CASUAL\"  |\"ATEMP\"  |\"HOLIDAY\"  |\"COUNT\"  |\"WORKINGDAY\"  |\"HUMIDITY\"  |\"WEATHER_OE\"  |\"REGISTERED\"  |\"WEATHER\"  |\"SEASON\"  |\"SEASON_OE\"  |\"PREDICTED_COUNT\"   |\n",
      "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "|0.0          |0.23404255319148934  |0         |14.395   |0          |1        |0             |75          |0.0           |1             |1          |1         |0.0          |33.901849013789615  |\n",
      "|0.0          |0.19148936170212763  |1         |12.88    |0          |3        |0             |86          |0.0           |2             |1          |1         |0.0          |-10.3606073314281   |\n",
      "|16.9979      |0.3829787234042553   |12        |19.695   |0          |36       |0             |76          |0.0           |24            |1          |1         |0.0          |86.13327234976997   |\n",
      "|19.9995      |0.46808510638297873  |47        |22.725   |0          |94       |0             |72          |1.0           |47            |2          |1         |0.0          |131.80551630295903  |\n",
      "|19.0012      |0.46808510638297873  |35        |22.725   |0          |106      |0             |72          |1.0           |71            |2          |1         |0.0          |130.89217838200688  |\n",
      "|19.9995      |0.425531914893617    |41        |21.21    |0          |93       |0             |82          |1.0           |52            |2          |1         |0.0          |90.53603970393944   |\n",
      "|16.9979      |0.425531914893617    |6         |21.21    |0          |37       |0             |88          |2.0           |31            |3          |1         |0.0          |78.10684082594925   |\n",
      "|15.0013      |0.40425531914893614  |11        |20.455   |0          |28       |0             |94          |1.0           |17            |2          |1         |0.0          |44.39336148403612   |\n",
      "|19.9995      |0.46808510638297873  |15        |22.725   |0          |39       |0             |88          |1.0           |24            |2          |1         |0.0          |83.91784036378853   |\n",
      "|16.9979      |0.44680851063829785  |1         |21.97    |0          |17       |0             |94          |1.0           |16            |2          |1         |0.0          |57.55971646297843   |\n",
      "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from snowflake.ml.modeling.linear_model import LinearRegression\n",
    "\n",
    "regressor = LinearRegression(\n",
    "    input_cols=CATEGORICAL_COLUMNS_OHE+FEATURE_LIST,\n",
    "    label_cols=LABEL_COLUMNS,\n",
    "    output_cols=OUTPUT_COLUMNS\n",
    ")\n",
    "# Train\n",
    "regressor.fit(train_df)\n",
    "# Predict\n",
    "result = regressor.predict(test_df)\n",
    "result.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "98aa0805",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "The version of package 'snowflake-snowpark-python' in the local environment is 1.12.1, which does not fit the criteria for the requirement 'snowflake-snowpark-python'. Your UDF might not work when the package version is different between the server and your local environment.\n",
      "The version of package 'snowflake-snowpark-python' in the local environment is 1.12.1, which does not fit the criteria for the requirement 'snowflake-snowpark-python'. Your UDF might not work when the package version is different between the server and your local environment.\n",
      "The version of package 'snowflake-snowpark-python' in the local environment is 1.12.1, which does not fit the criteria for the requirement 'snowflake-snowpark-python'. Your UDF might not work when the package version is different between the server and your local environment.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Mean squared error: 23721.358517843644\n",
      "explained_variance_score: 0.2721261318437842\n",
      "mean_absolute_error: 115.45514404202532\n",
      "mean_absolute_percentage_error: 4.924088936731415\n",
      "d2_absolute_error_score: 0.1634865823754551\n",
      "d2_pinball_score: 0.163486582375455\n"
     ]
    }
   ],
   "source": [
    "from snowflake.ml.modeling.metrics import mean_squared_error, explained_variance_score, mean_absolute_error, mean_absolute_percentage_error, d2_absolute_error_score, d2_pinball_score\n",
    "\n",
    "mse = mean_squared_error(df=result, y_true_col_names=\"COUNT\", y_pred_col_names=\"PREDICTED_COUNT\")\n",
    "evs = explained_variance_score(df=result, y_true_col_names=\"COUNT\", y_pred_col_names=\"PREDICTED_COUNT\")\n",
    "mae = mean_absolute_error(df=result, y_true_col_names=\"COUNT\", y_pred_col_names=\"PREDICTED_COUNT\")\n",
    "mape = mean_absolute_percentage_error(df=result, y_true_col_names=\"COUNT\", y_pred_col_names=\"PREDICTED_COUNT\")\n",
    "d2aes = d2_absolute_error_score(df=result, y_true_col_names=\"COUNT\", y_pred_col_names=\"PREDICTED_COUNT\")\n",
    "d2ps = d2_pinball_score(df=result, y_true_col_names=\"COUNT\", y_pred_col_names=\"PREDICTED_COUNT\")\n",
    "\n",
    "print(f\"Mean squared error: {mse}\")\n",
    "print(f\"explained_variance_score: {evs}\")\n",
    "print(f\"mean_absolute_error: {mae}\")\n",
    "print(f\"mean_absolute_percentage_error: {mape}\")\n",
    "print(f\"d2_absolute_error_score: {d2aes}\")\n",
    "print(f\"d2_pinball_score: {d2ps}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4ab3dd2d",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "colab": {
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
